home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Hardware / BlizKick / Modules / MuMove4K.ASM < prev    next >
Encoding:
Assembly Source File  |  2002-03-13  |  4.4 KB  |  225 lines

  1. ; FILE: Source:modules/MuMove4K.ASM          REV: 1 --- MuMove4k BlizKick module
  2.  
  3. ;
  4. ; MuMove4K BlizKick module implementation
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ;
  7. ; This module substitutes MuMove4K program by Thomas Richter.
  8. ; Based on reverse-engineered code of the original MuMove4K (Hi Thomas :-).
  9. ;
  10. ; BlizKick module adaption by Harry "Piru" Sintonen.
  11. ;
  12.  
  13.  
  14.     incdir    "include:"
  15.     include    "exec/ports.i"        ; Some required...
  16.     include    "exec/memory.i"
  17.     include    "exec/resident.i"
  18.     include    "exec/execbase.i"
  19.     include    "blizkickmodule.i"
  20.  
  21. _LVOForbid    EQU    -$84
  22. _LVOPermit    EQU    -$8A
  23. _LVOAllocMem    EQU    -$C6
  24. _LVOFreeMem    EQU    -$D2
  25. _LVORemove    EQU    -$FC
  26. _LVOEnqueue    EQU    -$10E
  27. _LVOAddPort    EQU    -$162
  28. _LVOTypeOfMem    EQU    -$216
  29.  
  30.  
  31.     ; private data structure used by
  32.     ; MuMove4K & MuFastZero.
  33.  
  34.     STRUCTURE mumovedata,0
  35.     STRUCT    mmd_pad0,$08        ; $00
  36.     STRUCT    mmd_romtag1,RT_SIZE    ; $08
  37.     STRUCT    mmd_romtag2,RT_SIZE    ; $22
  38.     APTR    mmd_rt1ptr        ; $3C
  39.     APTR    mmd_rt2ptr        ; $40
  40.     APTR    mmd_tagptr1        ; $44
  41.     ULONG    mmd_A1200        ; $48
  42.     ULONG    mmd_PREPAREEMUL        ; $4C
  43.     APTR    mmd_tagptr2        ; $50 (NULL -> MuMove4k can't remove the romtag)
  44.     STRUCT    mmd_pad1,$0A        ; $54
  45.     UWORD    mmd_version        ; $5E
  46.     APTR    mmd_mmd_ptr        ; $60
  47.     ULONG    mmd_allocsize        ; $64
  48.     STRUCT    mmd_port,MP_SIZE    ; $68 (this must be initialized)
  49.     UWORD    mmd_pad2        ; $8A
  50.     APTR    mmd_nextptr        ; $8C
  51.     APTR    mmd_realmhptr        ; $90
  52.     ULONG    mmd_maxsize        ; $94
  53.     APTR    mmd_codestart        ; $98
  54.     LABEL    mmd_SIZEOF        ; $9C
  55.  
  56.  
  57.     SECTION    MODULE,CODE
  58. _DUMMY_LABEL
  59.  BK_MOD 0,_end,(RTF_COLDSTART)<<24+37<<16+NT_UNKNOWN<<8+104,_name,_idstr,_init
  60.  
  61. ; COLDSTART module, requires KS V37.x or better, module type NT_UNKNOWN, priority 104.
  62.  
  63. _init    movem.l    d2/d3/a2-a4/a6,-(sp)
  64.     move.l    (4).w,a6
  65.  
  66.     move.l    #mmd_SIZEOF,d0
  67.     moveq    #MEMF_PUBLIC,d1
  68.     jsr    (_LVOAllocMem,a6)
  69.     tst.l    d0
  70.     beq    .exit2
  71.  
  72.     move.l    d0,a2
  73.     clr.l    (mmd_tagptr2,a2)
  74.     move.w    #1,(mmd_version,a2)
  75.     move.l    a2,(mmd_mmd_ptr,a2)
  76.     clr.l    (mmd_allocsize,a2)
  77.  
  78.     lea    (_portname,pc),a0
  79.     move.w    #(NT_MSGPORT<<8)|$9C,(mmd_port+LN_TYPE,a2)    ; pri = -100
  80.     move.l    a0,(mmd_port+LN_NAME,a2)
  81.     move.w    #(PA_IGNORE<<8),(mmd_port+MP_FLAGS,a2)
  82.     clr.l    (mmd_port+MP_SIGTASK,a2)
  83.     lea    (mmd_port+MP_MSGLIST,a2),a0
  84.     NEWLIST    a0
  85.  
  86. ;lbC00052C    movem.l    d2/d3/a2-a4/a6,-(sp)
  87. ;    move.w    #$0333,(_custom+color)
  88. ;    lea    (stuff,pc),a1
  89. ;    move.l    (4).w,a6
  90. ;    move.l    (-4,a1),a2
  91.     jsr    (_LVOForbid,a6)
  92.     clr.l    (mmd_nextptr,a2)
  93.     move.l    #$00008000,d3
  94.     move.l    (LibList,a6),a3
  95.     move.l    d3,d2
  96.     subq.l    #1,d3
  97.     bsr    .processlist
  98.     move.l    (DeviceList,a6),a3
  99.     bsr    .processlist
  100.     move.l    d2,(mmd_maxsize,a2)
  101.     move.l    d2,d3
  102. .loop    move.l    d3,d0
  103.     moveq    #MEMF_CHIP,d1
  104.     jsr    (_LVOAllocMem,a6)
  105.     tst.l    d0
  106.     move.l    d0,a1
  107.     beq.b    .nomem
  108.     lea    (a1,d3.l),a0
  109.     cmp.l    d2,a0
  110.     bhi.b    .free
  111.     move.l    (mmd_nextptr,a2),(MC_NEXT,a1)
  112.     move.l    d3,(MC_BYTES,a1)
  113.     move.l    a1,(mmd_nextptr,a2)
  114.     bra.b    .loop
  115.  
  116. .free    move.l    d3,d0
  117.     jsr    (_LVOFreeMem,a6)
  118. .nomem    lsr.l    #1,d3
  119.     bne.b    .loop
  120.  
  121.     moveq    #MH_SIZE,d0
  122.     moveq    #MEMF_PUBLIC|MEMF_CHIP,d1
  123.     jsr    (_LVOAllocMem,a6)
  124.     tst.l    d0
  125.     beq    .exit
  126.  
  127.     move.l    d0,a4
  128.     move.l    (MemList,a6),a3
  129. .find    tst.l    (a3)
  130.     beq.b    .exit
  131.     cmp.l    (MH_LOWER,a3),a4
  132.     bhi.b    .found
  133.     move.l    (a3),a3
  134.     bra.b    .find
  135.  
  136. .found    move.l    a3,a1
  137.     jsr    (_LVORemove,a6)
  138.  
  139.     move.l    a4,a1
  140.     move.l    a3,a0
  141.     moveq    #8-1,d0
  142. .copy    move.l    (a0)+,(a1)+
  143.     dbra    d0,.copy
  144.  
  145.     moveq    #MH_SIZE,d2
  146.     move.b    #-127,(LN_PRI,a3)
  147.     move.l    (mmd_port+LN_NAME,a2),(LN_NAME,a3)
  148.     move.w    #MEMF_CHIP,(MH_ATTRIBUTES,a3)
  149.     add.l    a4,d2
  150.     clr.l    (MH_FIRST,a3)
  151.     move.l    a4,(MH_UPPER,a3)
  152.     clr.l    (MH_FREE,a3)
  153.     move.l    d2,(MH_LOWER,a4)
  154.     move.l    a3,(mmd_realmhptr,a2)
  155.  
  156.     lea    (MemList,a6),a0
  157.     move.l    a3,a1
  158.     jsr    (_LVOEnqueue,a6)
  159.  
  160.     lea    (MemList,a6),a0
  161.     move.l    a4,a1
  162.     jsr    (_LVOEnqueue,a6)
  163.  
  164. .freeloop    move.l    (mmd_nextptr,a2),d0
  165.     beq.b    .done
  166.     move.l    d0,a1
  167.     move.l    (MC_NEXT,a1),(mmd_nextptr,a2)
  168.     move.l    (MC_BYTES,a1),d0
  169.     jsr    (_LVOFreeMem,a6)
  170.     bra.b    .freeloop
  171. .done
  172.     lea    (mmd_port,a2),a1
  173.     jsr    (_LVOAddPort,a6)
  174. ;
  175. ;.exit    jsr    (_LVOPermit,a6)
  176. ;    movem.l    (sp)+,d2/d3/a2-a4/a6
  177. ;.rts    rts
  178.  
  179.     sub.l    a2,a2
  180. .exit    jsr    (_LVOPermit,a6)
  181.  
  182.     move.l    a2,d0
  183.     beq.b    .nofree
  184.     move.l    a2,a1
  185.     move.l    #mmd_SIZEOF,d0
  186.     jsr    (_LVOFreeMem,a6)
  187. .nofree
  188. .exit2    movem.l    (sp)+,d2/d3/a2-a4/a6
  189. .rts    rts
  190.  
  191. .processlist    tst.l    (a3)
  192.     beq.b    .rts
  193.     move.l    a3,a1
  194.     jsr    (_LVOTypeOfMem,a6)
  195.     btst    #MEMB_CHIP,d0
  196.     beq.b    .pl_next
  197.     move.l    a3,d0
  198.     clr.w    d0
  199.     moveq    #0,d1
  200.     tst.l    d0
  201.     bne.b    .pl_next
  202.     move.w    (LIB_POSSIZE,a3),d1
  203.     lea    (a3,d1.l),a0
  204.     cmp.l    d2,a0
  205.     bcs.b    .pl_next
  206.     move.l    d3,d1
  207.     move.l    a0,d2
  208.     not.l    d1
  209.     add.l    d3,d2
  210.     and.l    d1,d2
  211. .pl_next    move.l    (a3),a3
  212.     bra.b    .processlist
  213.  
  214.  
  215. _portname
  216. _name    dc.b    '« MuMove4K »',0
  217. _idstr    dc.b    'MuMove4K 40.18 (26.10.01)',0
  218.     CNOP    0,2
  219. _end
  220.  
  221.     SECTION    VERSION,DATA
  222.  
  223.     dc.b    '$VER: MuMove4K_MODULE 40.18 (26.10.01)',0
  224.  
  225.